home *** CD-ROM | disk | FTP | other *** search
/ Network PC / Network PC.iso / amiga utilities / communication / bbs / termv4.6 / extras / source / gtlayout-source.lha / LT_DeleteHandle.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-18  |  3.8 KB  |  197 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1996 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. VOID
  15. LTP_DisposeGadgets(struct LayoutHandle *Handle)
  16. {
  17.     if(Handle->List)
  18.     {
  19.         struct Gadget    *Gadget;
  20.         ObjectNode        *Node;
  21.  
  22.         LTP_StripGadgets(Handle,Handle->List);
  23.  
  24.         Gadget = Handle->List;
  25.  
  26.         if(Handle->ExitFlush)
  27.         {
  28.             while(Gadget)
  29.             {
  30.                 if(GETOBJECT(Gadget,Node))
  31.                 {
  32.                     LTP_PutStorage(Node);
  33.  
  34.                     LTP_DeleteObjectNode(Handle,Node);
  35.                 }
  36.  
  37.                 Gadget = Gadget->NextGadget;
  38.             }
  39.         }
  40.         else
  41.         {
  42.             while(Gadget)
  43.             {
  44.                 if(GETOBJECT(Gadget,Node))
  45.                     LTP_DeleteObjectNode(Handle,Node);
  46.  
  47.                 Gadget = Gadget->NextGadget;
  48.             }
  49.         }
  50.  
  51.         FreeGadgets(Handle->List);
  52.  
  53.         Handle->List = NULL;
  54.     }
  55.  
  56. #ifdef DO_BOOPSI_KIND
  57.     if(Handle->BOOPSIList)
  58.     {
  59.         struct Gadget *gadget = (struct Gadget *)Handle->BOOPSIList,*next;
  60.         ObjectNode *Node;
  61.  
  62.         LTP_StripGadgets(Handle,(struct Gadget *)Handle->BOOPSIList);
  63.  
  64.         while(gadget)
  65.         {
  66.             next = gadget->NextGadget;
  67.  
  68.             if(GETOBJECT(gadget,Node))
  69.             {
  70.                 DisposeObject(gadget);
  71.  
  72.                 if(Node->Type == BOOPSI_KIND)
  73.                 {
  74.                     CloseLibrary(Node->Special.BOOPSI.ClassBase);
  75.                     Node->Special.BOOPSI.ClassBase = NULL;
  76.  
  77.                     FreeTagItems(Node->Special.BOOPSI.ClassTags);
  78.                     Node->Special.BOOPSI.ClassTags = NULL;
  79.                 }
  80.  
  81.                 Node->Host = NULL;
  82.             }
  83.  
  84.             gadget = next;
  85.         }
  86.  
  87.         Handle->BOOPSIList = NULL;
  88.         Handle->BOOPSIPrevious = NULL;
  89.     }
  90. #endif    /* DO_BOOPSI_KIND */
  91. }
  92.  
  93.  
  94. /*****************************************************************************/
  95.  
  96.  
  97. /****** gtlayout.library/LT_DeleteHandle ******************************************
  98. *
  99. *   NAME
  100. *    LT_DeleteHandle -- Release storage space allocated by
  101. *                       LT_CreateHandleTagList, closing windows,
  102. *                       removing gadgets, etc.
  103. *
  104. *   SYNOPSIS
  105. *    LT_DeleteHandle(Handle);
  106. *                      A0
  107. *
  108. *    VOID LT_DeleteHandle(LayoutHandle *);
  109. *
  110. *   FUNCTION
  111. *    Windows and gadgets created by LT_CreateHandleTagList()
  112. *    are removed, any associated memory is deallocated.
  113. *
  114. *   INPUTS
  115. *    Handle - Pointer to a LayoutHandle structure created
  116. *        by LT_CreateHandleTaglist(). Passing NULL is
  117. *        harmless.
  118. *
  119. *   RESULT
  120. *    none
  121. *
  122. *   SEE ALSO
  123. *    gtlayout.library/CreateHandleTagList
  124. *
  125. ******************************************************************************
  126. *
  127. */
  128.  
  129. VOID LIBENT
  130. LT_DeleteHandle(_REG(a0) LayoutHandle *Handle)
  131. {
  132.     if(Handle)
  133.     {
  134.         if(Handle->UnlockPubScreen)
  135.             UnlockPubScreen(NULL,Handle->PubScreen);
  136. #ifdef DO_CLONING
  137.         if(Handle->CloneExtra && Handle->CloneExtra->Screen)
  138.             ScreenToBack(Handle->CloneExtra->Screen);
  139. #endif
  140.         LTP_DisposeGadgets(Handle);
  141.  
  142.         LT_UnlockWindow(Handle->Parent);
  143.  
  144.         if(Handle->Window)
  145.         {
  146.             LT_DeleteWindowLock(Handle->Window);
  147.  
  148.             if(Handle->MsgPort && Handle->Window->UserPort)
  149.             {
  150.                 struct IntuiMessage    *intuiMsg;
  151.                 struct Node            *next;
  152.  
  153.                 Forbid();
  154.  
  155.                 for(intuiMsg = (struct IntuiMessage *)Handle->Window->UserPort->mp_MsgList.lh_Head ; next = intuiMsg->ExecMessage.mn_Node.ln_Succ ; intuiMsg = (struct IntuiMessage *)next)
  156.                 {
  157.                     if(intuiMsg->IDCMPWindow == Handle->Window)
  158.                     {
  159.                         Remove(intuiMsg);
  160.  
  161.                         ReplyMsg(intuiMsg);
  162.                     }
  163.                 }
  164.  
  165.                 Handle->Window->UserPort = NULL;
  166.  
  167.                 ModifyIDCMP(Handle->Window,NULL);
  168.  
  169.                 Permit();
  170.             }
  171.  
  172.             ClearMenuStrip(Handle->Window);
  173.             CloseWindow(Handle->Window);
  174.         }
  175.  
  176. #ifdef DO_MENUS
  177.         LT_DisposeMenu(Handle->Menu);
  178. #endif    // DO_MENUS
  179.  
  180.         DisposeObject(Handle->AmigaGlyph);
  181.         DisposeObject(Handle->CheckGlyph);
  182.  
  183.         FreeScreenDrawInfo(Handle->Screen,Handle->DrawInfo);
  184.  
  185.         FreeVisualInfo(Handle->VisualInfo);
  186.  
  187.         if(Handle->RPort.Font && Handle->CloseFont)
  188.             CloseFont(Handle->RPort.Font);
  189. #ifdef DO_CLONING
  190.         if(Handle->CloneExtra && Handle->CloneExtra->Screen)
  191.             CloseScreen(Handle->CloneExtra->Screen);
  192. #endif
  193.  
  194.         AsmDeletePool(Handle->Pool,SysBase);
  195.     }
  196. }
  197.